| ..:: Menu ::.. | ..:: Lekcja 6: Zapisywanie konfiguracji programu ::.. | ..::Info i Reklamy::.. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Strona Główna Kursy DELPHI Kursy C++ Linki Forum Download Seriale Humor Reklama O autorze |
Wykorzystanie rejestru i plików INIByć może zastanawiasz się do czego służy rejestr i pliki INI. Rejestr Windows służy do zapisywania konfiguracji programów. Wyobraź sobie, że chciałbyś zapisać ustawienia Twojego programu. Przykładowo piszesz tekst w komponencie "Edit", zamykasz program, a następnie uruchamiasz go ponownie i na etykiecie widnieje taki sam tekst jak przy zamykaniu programu. Można to łatwo zrobić z wykorzystaniem rejestru lub plików INI.Najpierw rejestr. Przede wszystkim, aby korzystać z rejestru musisz do listy modułów uses dodać słowo "Registry". 1. Umieść na formularzu komponent "MaskEdit" ( paleta: Additional ). Komponent ten służy do ustawiania tzw. maski. Znaczy to, że Delphi 'dopilnuje', żebyś wpisał np. numer kodu. Za chwilę sam się o tym przekonasz. W Inspektorze Obiektów zmień nazwę komponentu na "Password". Teraz odnajdź pole "EditMask" - pojawi się okienko do wyboru maski. Po lewej stronie kliknij "ZipCode". Oznacza to, że hasło składać się będzie z pięciu cyfr. Kliknij OK - maska została ustawiona. Teraz odnajdź pole "PasswordChar". W tym polu należy wpisać znak, który będzie "przysłaniał" pisany przez Ciebie kod. W tej właściwości wpisz znak *. Teraz zamiast pisanych cyfr pojawiać się będzie właśnie ten znak. 2. Wygeneruj procedurę "OnDestroy" formy - uruchamiana ona będzie w chwili gdy użytkownik zamknie program. Wpisz w nią taki tekst ( później objaśnię ): procedure TForm1.FormDestroy(Sender: TObject); var Reg : TRegistry; // zmienna wskazuje na rejestr begin Reg := TRegistry.Create; try Reg.OpenKey('Software\Delphi Kurs', True); // stworzenie klucza Reg.WriteString('Haslo', Password.Text); // utworzenie wartosci finally Reg.Free; // zwolnij pamięć end; end; Od tej pory przy zamykaniu programu do rejestru zostanie wpisane hasło z komponentu "Password". Już wyjaśniam o co właściwie chodzi. Na samym początku należało utworzyć zmienną typu "Registry". Później ją stworzyłem. Następnie polecenie "Reg.OpenKey" otwiera klucz z rejestru. Wartości domyślnie są zapisywane do klucza głównego HKEY_CURRENT_USER. A więc w nawiasie tej funkcji jako pierwszy parametr podawana jest nazwa klucza, który ma zostać otwarty. Drugi parametr "mówi" czy klucz ma być utworzony jeżeli nie istnieje ( True ), czy też nie ( False ). Kolejna funkcja do "Reg.WriteString". Zapisuje ona do rejestru wartość typu "String". Pierwszym parametrem tej funkcji jest nazwa klucza do zapisania, a drugim sama wartość typu "String". W tej funkcji do rejestru zapisana została treść kontrolki "Edit". Na samym końcu następuje zwolnienie pamięci zajętej przez zmienną "Reg". Zauważ, że użyłem tutaj wyjątków. Powoduje to bezwzględne zwolnienie pamięci bez względu na to czy operacja się powiedzie, czy też nie. OK, uruchom teraz program i zamknij go - do rejestru zapisana została wartość typu "String". Możesz to sprawdzić. Uruchom rejestr ( Start -> Uruchom -> Regedit ). Wartość nasza została do rejestru zapisana pod kluczem: HKEY_CURRENT_USER\Software\Delphi Kurs. Możesz to sprawdzić. Dobra. Jeżeli hasło znajduje się już w rejestrze to należy wygenerować procedurę "OnCreate" formy, która sprawdzać będzie hasło. Poniższa procedura ma sprawdzać czy klucz w rejestrze istnieje. Jeżeli nie to nic nie robi - jeżeli istnieje to wyświetl okno z prośbą o wpisanie hasła: procedure TForm1.FormCreate(Sender: TObject); var Reg : TRegistry; // zmienna oznaczajaca rejestr Istnieje : Boolean; begin Reg := TRegistry.Create; // stworz rejestr try { Jezeli klucz istnieje to zmienna "Istnieje" przyjmuje wartosc True } Istnieje := Reg.OpenKey('Software\Delphi Kurs', False); if Not Istnieje then // Jezeli zmienna = False to znaczy, ze klucz nie istnieje... Exit else //... wtedy nie rob nic. Jezeli klucz istnieje to wywolaj okno: if InputBox('Podaj hasło!', 'Wpisz hasło:', '') <> Reg.ReadString('Haslo') then begin // Jezeli haslo jest nieprawidlwe MessageDlg('Błędne hasło. Program zostanie zakończony!', mtError, [mbOK], 0); Application.Terminate; // zakoncz program end; finally Reg.Free; end; end; Ta procedura jest trochę dłuższa i trudniejsza. Sprawdza ona bowiem czy klucz istnieje. Zmienna "Istnieje" przechowuje informacje o tym, czy klucz istnieje, czy też nie. Następuje otwarcie klucza. Jeżeli klucz istnieje to zmienna "Istnieje" przybiera wartość True. Jeżeli jest odwrotnie to False. Następnie następuje sprawdzenie jaka jest wartość zmiennej "Istnieje". Jeżeli False ( if not Istnieje then... znaczy to samo co if Istnieje = False then.... ) to nic się nie dzieje. Polecenie "Exit" działa tak samo jak "Break" - przerywa działanie programu. Jeżeli klucz istnieje to wyświetlane jest okno z informacją o podanie hasła. Umożliwia to funkcja "InputBox. Pierwszym jej parametrem jest tekst, który pojawi się na pasku okna, drugi to tekst etykiety, a ostatni to domyślne hasło, które pojawi się w oknie typu "Edit". Następuje tutaj porównanie wpisanego hasła z wartością wczytaną z rejestru ( Reg.ReadString ). Jeżeli te dwie wartości są różne to następuje wyświetlenie odpowiedniej informacji ( MessageDlg - mowa o tym była we wcześniejszych odcinkach ) i zakończenie programu. Normalnie do zakończenia działania programu służy polecenie "Close", ale działa ono tylko wtedy gdy widoczna jest forma. Jeżeli forma jest niewidoczna to należy stosować Application.Terminate, która kończy działanie programu. Oczywiście możesz także zapisywać wartości typu "Integer" czy "Boolean", a nawet datę czy wartości zmienno - przecinkowe. Oto przykłady: // typ Integer Reg.WriteInteger('WartoscInteger', 12); // zapisana liczba 12 // odczyt typu Integer Edit1.Text := IntToStr( Reg.ReadString('WartoscInteger')); // typ Boolean Reg.WriteBool('WartoscBoolean', True); // zapisana wartość True // odczytanie wartości Boolean: Checkbox1.Checked := Reg.ReadBool( 'WartoscBoolean'); // typ zmienno - przecinkowy Reg.WriteCurrency('WartoscCurrency', 3.12); // zapisanie 3.12 // odczyt wartości Currency: Edit2.Text := CurrToStr( Reg.ReadCurrency('WartoscCurrency')); // zapisz aktualną datę i czas Reg.WriteDateTime('DataIczas', Now); // odczytaj datę i czas Edit3.Text := DateTimeToStr( Reg.ReadDateTime('DataIczas')); // odczytaj datę i czas Oto dodatkowe funkcje związane z rejestrem:
Domyślnie w Delphi wszystkie klucze zapisywane są do klucza głównego HKEY_CURRENT_USER. Jeżeli chcesz to zmienić to rób tak: Reg.RootKey := HKEY_CLASSES_ROOT; Reg.OpenKey('Moj Klucz', True); Pliki INIOperowanie na plikach INI jest bardzo podobne. Istnieją różnice, oczywiście, ale są one małe. Być może wiesz lub nie, że plik INI składa się z sekcji. Są różne sekcje, a w nich nazwy kluczy i ich wartości. Żeby korzystać z plików INI musisz do listy modułów uses dodać słowo "INIFiles". W procedurze możesz napisać:var INI : TINIFile; begin INI := TINIFile.Create('C:\plikini.ini'); // stworz plik INI na dysku C try INI.WriteString('Sekcja01', 'Klucz', Edit1.Text); finally INI.Free; end; end; Taka procedura spowoduje zapisanie odpowiednich wartości do pliku INI, który zostanie stworzony na dysku C. Na początku stworzona została zmienna typu "TINIFile", której parametrem jest ścieżka gdzie plik ma być zapisany. Później następuje do pliku INI wartości typu String. Pierwszym parametrem tej funkcji jest nazwa sekcji. Drugi parametr to nazwa klucza, a ostatnim to wartość która ma być zapisana do pliku INI. Wartość ta to tekst , który przechowywany jest w kontrolce Edit. Jeżeli podczas tworzenia pliku INI nie podczas konkretnej ścieżki, a tylko nazwę pliku INI to ten plik zostanie stworzony w katalogu z Windowsem. Teraz odczytanie wartości: var INI : TINIFile; begin INI := TINIFile.Create('C:\Plikini.ini'); try Edit1.Text := INI.ReadString('Sekcja01', 'Klucz', 'Domyślna wartość'); finally INI.Free; end; end; Odczytywanie jest bardzo podobne. Zostanie stworzenie zmiennej INI, a następnie odczytanie wartości. Do tekstu kontrolki Edit zostanie odczytany klucz z pliku INI. Pierwszym jej parametrem jest nazwa sekcji z pliku INI, kolejny to nazwa klucza, a ostatnia wartość to domyślna wartość. Ta domyślna wartość zostanie w kontrolce wpisana jeżeli plik INI nie istnieje lub jeżeli nie istnieje taki klucz. Podobnie ma się sprawa z wartościami typu Integer lub Boolean:
To tyle. Jeżeli chcesz uzyskać szczegóły to możesz doczytać w systemie pomocy Delphi. Postanowiłem jeszcze omówić typ "TStrings", a dokładnie "ReadSections". Odczytuje ona z pliku INI wszystkie sekcie i zwraca wynik w postaci zmiennej "TStrings". Oto przykład: var INI : TINIFile; begin INI := TINIFile.Create('C:\Plikini.ini'); try INI.ReadSections(ListBox1.Items); finally INI.Free; end; end; Umieść na formie komponent "ListBox" i sprawdź działanie procedury. "Items" przy komponencie "ListBox" oznacza wartości znajdujące się w tym komponencie. |
Reklama To miejsce czeka na twoją reklame. Więcej informacji w dziale Reklama |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||